package com.project.springboot.proxy.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

import java.util.Arrays;

/**
 * description: 生成代理类的工厂
 * @author 朱正磊
 * @date 2024-03-06 14:31:52
 */
public class ProxyFactory {

    /**
     * description: 通过该方法可以生成任意目标类所对应的代理类
     * @author 朱正磊
     * @date 2024-03-06 14:38:21
     * @param target 任意目标类对象
     * @return 返回任意目标类所对应的代理类
     */
    public static Object getProxy(Object target) {
        return Enhancer.create(target.getClass(), (MethodInterceptor) (o, method, objects, methodProxy) -> {
            Object result = null;
            try {
                System.out.println("【动态代理】【日志】" + method.getName() + "，参数：" + Arrays.toString(objects));
                // 通过反射调用method对象所表示的方法, 并获取该方法的返回值
                result = method.invoke(target, objects);
                System.out.println("【动态代理】【日志】" + method.getName() + "，结果：" + result);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("【动态代理】【日志】" + method.getName() + "，异常：" + e.getMessage());
            } finally {
                System.out.println("【动态代理】【日志】" + method.getName() + "，方法执行完毕");
            }
            return result;
        });
    }

}
